package com.mall.server.service.ums;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mall.autoconfig.exception.BusinessException;
import com.mall.dubbo.api.UmsMenuApi;
import com.mall.model.domain.UmsMenu;
import com.mall.model.vo.CommonPage;
import com.mall.model.vo.UmsMenuVo;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class UmsMenuService {

    @DubboReference
    private UmsMenuApi umsMenuApi;

    // 添加后台菜单
    public void saveMenu(UmsMenu umsMenu) {

        umsMenu.setCreateTime(new Date());

        if (umsMenu.getParentId() == 0) {
            umsMenu.setLevel(0);
        } else {
            umsMenu.setLevel(1);
        }

        umsMenuApi.saveMenu(umsMenu);

    }

    //分页查询后台菜单
    public CommonPage findById(Integer parentId, Integer pageNum, Integer pageSize) {

        Page<UmsMenu> page = umsMenuApi.findById(parentId, pageNum, pageSize);

        return new CommonPage(page);
    }


    //根据ID删除后台菜单
    public void deleteUmsMenu(Integer id) {

        List<UmsMenu> list = umsMenuApi.findids(id);
        if (!CollUtil.isEmpty(list)) {
            throw new BusinessException("此菜单下有数据");
        }
        umsMenuApi.deleteUmsMenu(id);
    }

    //树形结构返回所有菜单列表
    public List<UmsMenuVo> findTreeList() {

        //查询父级信息
        List<UmsMenu> parentList = umsMenuApi.findByParentIds();
        if (CollUtil.isEmpty(parentList)) {
            return null;
        }
        List<Long> ids = CollUtil.getFieldValues(parentList, "id", Long.class);


        //查询子级信息
        List<UmsMenu> menus = umsMenuApi.findByChiledIds(ids);

        List<UmsMenuVo> vos = new ArrayList<>();
        for (UmsMenu umsMenu : parentList) {
            List<UmsMenu> list = new ArrayList<>();
            for (UmsMenu menu : menus) {
                if (menu.getParentId().equals(umsMenu.getId())) {
                    list.add(menu);
                }
            }

            UmsMenuVo vo = UmsMenuVo.init(umsMenu, list);
            vos.add(vo);
        }

        return vos;

    }

    //修改后台菜单
    public void updateMenu(Integer id, UmsMenu umsMenu) {

        if (umsMenu.getParentId() == 0) {
            umsMenu.setLevel(0);
        } else {
            umsMenu.setLevel(1);
        }

        umsMenuApi.updateMenu(id, umsMenu);

    }

    //修改菜单显示状态
    public void updateHiddenMenu(Integer id, Integer hidden) {

        UmsMenu umsMenu = new UmsMenu();
        umsMenu.setHidden(hidden);

        umsMenuApi.updateMenu(id, umsMenu);
    }

    //根据ID获取菜单详情
    public UmsMenu findId(Integer id) {

        return umsMenuApi.findId(id);
    }

}
